module seg_proc (
    input clk,  // 50MHz 时钟信号
    input rst_n,  // 低电平复位信号
    input [31:0] seg_number_in,  // 输入的数字内容
    input [7:0] dp,  // 每个位的小数点状态（1: 显示小数点，0: 不显示）
    output [7:0] dula,  // 段选信号，用于控制数码管的段（LED 显示内容）
    output [7:0] wela  // 位选信号，用于控制当前激活的数码管位
);


    wire                                    clk_1k;  // 1kHz 时钟信号，用于扫描刷新显示
    reg  [2:0]                              bits;  // 当前显示的数码管位索引（0 到 7）
    reg  [3:0]                              current_num;  // 当前显示位的数字内容（0-9）
    reg                                     current_dp;  // 当前显示位的小数点状态

    wire [3:0] num7 = seg_number_in[3:0];
    wire [3:0] num6 = seg_number_in[7:4];
    wire [3:0] num5 = seg_number_in[11:8];
    wire [3:0] num4 = seg_number_in[15:12];
    wire [3:0] num3 = seg_number_in[19:16];
    wire [3:0] num2 = seg_number_in[23:20];
    wire [3:0] num1 = seg_number_in[27:24];
    wire [3:0] num0 = seg_number_in[31:28];




    // 分频器实例化，将 50MHz 时钟分频至 1kHz，用于数码管的动态扫描
    frequency_divider u_frequency_divider (
        .clk    (clk),         // 输入 50MHz 时钟信号
        .rst_n  (rst_n),       // 低电平复位信号
        .clkbase(50_000_000),  // 基准时钟频率 50MHz
        .clkdiv (1_000),       // 输出时钟频率 1kHz
        .clkout (clk_1k)       // 分频输出时钟信号
    );

    // 根据当前的位选择信号 `bits`，选择对应的数码管输入数据和小数点状态
    always @(*) begin
        case (bits)
            3'd0: begin
                current_num = num0;  // 数码管位 0 的数字输入
                current_dp  = dp[0];  // 数码管位 0 的小数点状态
            end
            3'd1: begin
                current_num = num1;  // 数码管位 1 的数字输入
                current_dp  = dp[1];  // 数码管位 1 的小数点状态
            end
            3'd2: begin
                current_num = num2;  // 数码管位 2 的数字输入
                current_dp  = dp[2];  // 数码管位 2 的小数点状态
            end
            3'd3: begin
                current_num = num3;  // 数码管位 3 的数字输入
                current_dp  = dp[3];  // 数码管位 3 的小数点状态
            end
            3'd4: begin
                current_num = num4;  // 数码管位 4 的数字输入
                current_dp  = dp[4];  // 数码管位 4 的小数点状态
            end
            3'd5: begin
                current_num = num5;  // 数码管位 5 的数字输入
                current_dp  = dp[5];  // 数码管位 5 的小数点状态
            end
            3'd6: begin
                current_num = num6;  // 数码管位 6 的数字输入
                current_dp  = dp[6];  // 数码管位 6 的小数点状态
            end
            3'd7: begin
                current_num = num7;  // 数码管位 7 的数字输入
                current_dp  = dp[7];  // 数码管位 7 的小数点状态
            end
            default: begin
                current_num = 4'd10;  // 默认灭灯
                current_dp  = 1'b0;  // 默认小数点不亮
            end
        endcase
    end

    // 数码管驱动模块实例化，根据当前位的数字和小数点状态，生成段选和位选信号
    seg_driver u_seg_driver (
        .digit       (current_num),  // 当前显示位的数字
        .rst_n       (rst_n),        // 低电平复位信号
        .current_dp  (current_dp),   // 当前显示位的小数点状态
        .position    (bits),         // 当前显示的数码管位
        .digit_sel   (wela),         // 位选信号，用于选择当前显示的数码管位
        .segment_data(dula)          // 段选信号，用于选择数码管显示的内容
    );

    // 动态扫描逻辑，每 1ms 切换一个显示位
    always @(posedge clk_1k or negedge rst_n) begin
        if (!rst_n) bits <= 3'd0;  // 复位时从第 0 位开始显示
        else bits <= (bits == 3'd7) ? 3'd0 : bits + 3'd1;  // 切换到下一个显示位
    end
endmodule
